package MVC.Views;

import MVC.Controller;
import MVC.Models.Jogador;
import MVC.Models.Posicao;
import MVC.Models.Tabuleiro;
import MVC.View;
import Resources.Enums.Cor;
import Resources.Enums.Quadrante;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class TabuleiroView extends View implements ActionListener, MouseListener {

    /* Atributos */

    private JPanel mainPanel;
    private JPanel tabuleiroPanel;
    private JPanel statusPanel;
    private JPanel primeiroQuadrantePanel;
    private JPanel segundoQuadrantePanel;
    private JPanel terceiroQuadrantePanel;
    private JPanel quartoQuadrantePanel;
    private JPanel rotacaoTopPanel;
    private JPanel rotacaoBottomPanel;
    private JButton rotateRightQuad1;
    private JButton rotateRightQuad2;
    private JButton rotateRightQuad3;
    private JButton rotateRightQuad4;
    private JButton rotateLeftQuad1;
    private JButton rotateLeftQuad2;
    private JButton rotateLeftQuad3;
    private JButton rotateLeftQuad4;
    private JLabel jogador1CorLabel;
    private JLabel jogador2CorLabel;
    private JLabel jogador2NomeLabel;
    private JLabel jogador1NomeLabel;
    private JLabel label1;
    private JLabel label2;
    private JLabel label3;
    private JLabel label4;
    private JLabel label5;
    private JLabel label6;
    private JLabel label7;
    private JLabel label8;
    private JLabel label9;
    private JLabel label10;
    private JLabel label11;
    private JLabel label12;
    private JLabel label13;
    private JLabel label14;
    private JLabel label15;
    private JLabel label16;
    private JLabel label17;
    private JLabel label18;
    private JLabel label19;
    private JLabel label20;
    private JLabel label21;
    private JLabel label22;
    private JLabel label23;
    private JLabel label24;
    private JLabel label25;
    private JLabel label26;
    private JLabel label27;
    private JLabel label28;
    private JLabel label29;
    private JLabel label30;
    private JLabel label31;
    private JLabel label32;
    private JLabel label33;
    private JLabel label34;
    private JLabel label35;
    private JLabel label36;
    private JLabel[][] posicoesLabel;
    private JMenuItem iniciarPartidaMenuItem;
    private JMenuItem desconectarMenuItem;

    public TabuleiroView() {
        posicoesLabel = new JLabel[6][6];
        posicoesLabel[0][0] = label1;
        posicoesLabel[0][1] = label2;
        posicoesLabel[0][2] = label3;
        posicoesLabel[0][3] = label4;
        posicoesLabel[0][4] = label5;
        posicoesLabel[0][5] = label6;

        posicoesLabel[1][0] = label7;
        posicoesLabel[1][1] = label8;
        posicoesLabel[1][2] = label9;
        posicoesLabel[1][3] = label10;
        posicoesLabel[1][4] = label11;
        posicoesLabel[1][5] = label12;

        posicoesLabel[2][0] = label13;
        posicoesLabel[2][1] = label14;
        posicoesLabel[2][2] = label15;
        posicoesLabel[2][3] = label16;
        posicoesLabel[2][4] = label17;
        posicoesLabel[2][5] = label18;

        posicoesLabel[3][0] = label19;
        posicoesLabel[3][1] = label20;
        posicoesLabel[3][2] = label21;
        posicoesLabel[3][3] = label22;
        posicoesLabel[3][4] = label23;
        posicoesLabel[3][5] = label24;

        posicoesLabel[4][0] = label25;
        posicoesLabel[4][1] = label26;
        posicoesLabel[4][2] = label27;
        posicoesLabel[4][3] = label28;
        posicoesLabel[4][4] = label29;
        posicoesLabel[4][5] = label30;

        posicoesLabel[5][0] = label31;
        posicoesLabel[5][1] = label32;
        posicoesLabel[5][2] = label33;
        posicoesLabel[5][3] = label34;
        posicoesLabel[5][4] = label35;
        posicoesLabel[5][5] = label36;

        rotateLeftQuad1.addActionListener(this);
        rotateLeftQuad1.setActionCommand(":clickRotacaoLeftQuad1");
        rotateRightQuad1.addActionListener(this);
        rotateRightQuad1.setActionCommand(":clickRotacaoRightQuad1");

        rotateLeftQuad2.addActionListener(this);
        rotateLeftQuad2.setActionCommand(":clickRotacaoLeftQuad2");
        rotateRightQuad2.addActionListener(this);
        rotateRightQuad2.setActionCommand(":clickRotacaoRightQuad2");

        rotateLeftQuad3.addActionListener(this);
        rotateLeftQuad3.setActionCommand(":clickRotacaoLeftQuad3");
        rotateRightQuad3.addActionListener(this);
        rotateRightQuad3.setActionCommand(":clickRotacaoRightQuad3");

        rotateLeftQuad4.addActionListener(this);
        rotateLeftQuad4.setActionCommand(":clickRotacaoLeftQuad4");
        rotateRightQuad4.addActionListener(this);
        rotateRightQuad4.setActionCommand(":clickRotacaoRightQuad4");

        for (int i = 0; i < 6; i++)
            for (int j = 0; j < 6; j++)
                posicoesLabel[i][j].addMouseListener(this);

        iniciarPartidaMenuItem = new JMenuItem("Iniciar Partida");
        iniciarPartidaMenuItem.addActionListener(this);
        iniciarPartidaMenuItem.setActionCommand(":iniciarPartida");

        desconectarMenuItem = new JMenuItem("Desconectar");
        desconectarMenuItem.addActionListener(this);
        desconectarMenuItem.setActionCommand(":desconectar");
    }

    /* Métodos */
    public void rendered() {
        frame.setSize(new Dimension(550, 550));

        jogoMenu.add(iniciarPartidaMenuItem);
        jogoMenu.add(desconectarMenuItem);

        refresh();
        show();
    }

    public void refresh() {
        Jogador jogador = Controller.jogadorController.getJogador();
        Tabuleiro tabuleiro = Controller.jogadorController.getTabuleiro();
        Jogador oponente = tabuleiro.getOponente();

        jogador1NomeLabel.setText(jogador.getNome());
        jogador1NomeLabel.setFont(new Font(jogador1NomeLabel.getFont().getName(), jogador.getDaVez() ? Font.BOLD : Font.PLAIN, jogador1NomeLabel.getFont().getSize()));
        jogador1CorLabel.setText(jogador.getCor() != null ? jogador.getCor().getNome() : "");

        jogador2NomeLabel.setText(oponente != null ? oponente.getNome() : "");
        jogador2NomeLabel.setFont(new Font(jogador2NomeLabel.getFont().getName(), oponente != null && oponente.getDaVez() ? Font.BOLD : Font.PLAIN, jogador2NomeLabel.getFont().getSize()));
        jogador2CorLabel.setText(oponente != null ? oponente.getCor().getNome() : "");

        Posicao[][] posicoes = tabuleiro.getPosicoes();

        for (int i = 0; i < 6; i++)
            for (int j = 0; j < 6; j++)
                if (posicoes[i][j].getPeca() != null) {
                    String path = "../../Resources/Images/";
                    path += (posicoes[i][j].getPeca().getCor() == Cor.PRETO) ? "p1.png" : "p2.png";
                    ImageIcon icone = new ImageIcon(getClass().getResource(path));
                    posicoesLabel[i][j].setIcon(icone);
                } else {
                    String path = "../../Resources/Images/pentago-red.png";
                    ImageIcon icone = new ImageIcon(getClass().getResource(path));
                    posicoesLabel[i][j].setIcon(icone);
                }

        if (jogador.getVencedor())
            alert("Você venceu :)");
        else if (oponente != null && oponente.getVencedor())
            alert("Você perdeu :(");

    }

    public JPanel mainPanel() {
        return mainPanel;
    }

    public void actionPerformed(ActionEvent actionEvent) {
        String action = actionEvent.getActionCommand();

        if (action.equals(":clickRotacaoLeftQuad1")) {
            clickRotacao(Quadrante.PRIMEIRO, false);
        } else if (action.equals(":clickRotacaoRightQuad1")) {
            clickRotacao(Quadrante.PRIMEIRO, true);
        } else if (action.equals(":clickRotacaoLeftQuad2")) {
            clickRotacao(Quadrante.SEGUNDO, false);
        } else if (action.equals(":clickRotacaoRightQuad2")) {
            clickRotacao(Quadrante.SEGUNDO, true);
        } else if (action.equals(":clickRotacaoLeftQuad3")) {
            clickRotacao(Quadrante.TERCEIRO, false);
        } else if (action.equals(":clickRotacaoRightQuad3")) {
            clickRotacao(Quadrante.TERCEIRO, true);
        } else if (action.equals(":clickRotacaoLeftQuad4")) {
            clickRotacao(Quadrante.QUARTO, false);
        } else if (action.equals(":clickRotacaoRightQuad4")) {
            clickRotacao(Quadrante.QUARTO, true);
        } else if (action.equals(":iniciarPartida")) {
            iniciarPartida();
        } else if (action.equals(":desconectar")) {
            desconectar();
        }
    }
    public void mouseClicked(MouseEvent mouseEvent) {
        JLabel label = (JLabel) mouseEvent.getSource();

        for (int i = 0; i < 6; i++)
            for (int j = 0; j < 6; j++)
                if(posicoesLabel[i][j].equals(label))
                    click(i, j);
    }

    public void mousePressed(MouseEvent mouseEvent) {

    }

    public void mouseReleased(MouseEvent mouseEvent) {

    }

    public void mouseEntered(MouseEvent mouseEvent) {

    }

    public void mouseExited(MouseEvent mouseEvent) {

    }

    public void click(Integer linha, Integer coluna) {
        Controller.jogadorController.click(linha, coluna);
    }

    public void clickRotacao(Quadrante quadrante, Boolean horario) {
        Controller.jogadorController.clickRotacao(quadrante, horario);
    }

    public void iniciarPartida() {
        Controller.jogadorController.iniciarPartida();
    }

    public void desconectar() {
        Controller.jogadorController.desconectar();
    }

}
